package model

import (
	"gorm.io/gorm"
	"time"
)

// Patient 患者信息表（就诊人）
type Patient struct {
	ID             int64          `gorm:"primaryKey;autoIncrement" json:"id"`
	UserID         int64          `gorm:"index;not null;comment:用户ID" json:"userId"`
	Name           string         `gorm:"type:varchar(50);not null;comment:姓名" json:"name"`
	Gender         int            `gorm:"type:tinyint;default:0;comment:性别 0:未知 1:男 2:女" json:"gender"`
	BirthDate      string         `gorm:"type:varchar(20);comment:出生日期" json:"birthDate"`
	Phone          string         `gorm:"type:varchar(11);comment:手机号" json:"phone"`
	IdCard         string         `gorm:"type:varchar(18);comment:身份证号" json:"idCard"`
	AllergyHistory string         `gorm:"type:text;comment:过敏史" json:"allergyHistory"`
	MedicalHistory string         `gorm:"type:text;comment:病史" json:"medicalHistory"`
	Relation       string         `gorm:"type:varchar(20);comment:与用户关系" json:"relation"`
	IsVerified     bool           `gorm:"default:false;comment:是否实名认证" json:"isVerified"`
	IsDefault      bool           `gorm:"default:false;comment:是否默认就诊人" json:"isDefault"`
	CreatedAt      time.Time      `json:"createdAt"`
	UpdatedAt      time.Time      `json:"updatedAt"`
	DeletedAt      gorm.DeletedAt `gorm:"index" json:"-"`
}

func (Patient) TableName() string {
	return "patients"
}

// ==================== 模型方法 ====================

// GetByID 根据ID获取患者信息
func (p *Patient) GetByID(db *gorm.DB, id, userID int64) error {
	return db.Where("id = ? AND user_id = ?", id, userID).First(p).Error
}

// GetDefaultByUserID 获取用户的默认就诊人
func (p *Patient) GetDefaultByUserID(db *gorm.DB, userID int64) error {
	return db.Where("user_id = ?", userID).
		Order("is_default DESC, id ASC").
		First(p).Error
}

// GetListByUserID 获取用户的就诊人列表
func GetPatientListByUserID(db *gorm.DB, userID int64) ([]Patient, error) {
	var patients []Patient
	err := db.Where("user_id = ?", userID).
		Order("is_default DESC, id ASC").
		Find(&patients).Error
	return patients, err
}

// Create 创建患者记录
func (p *Patient) Create(db *gorm.DB) error {
	// 如果是第一个就诊人，设为默认
	var count int64
	db.Model(&Patient{}).Where("user_id = ?", p.UserID).Count(&count)
	if count == 0 {
		p.IsDefault = true
	}

	p.CreatedAt = time.Now()
	p.UpdatedAt = time.Now()
	return db.Create(p).Error
}

// Update 更新患者信息
func (p *Patient) Update(db *gorm.DB, updates map[string]interface{}) error {
	updates["updated_at"] = time.Now()
	return db.Model(p).Updates(updates).Error
}

// Verify 实名认证
func (p *Patient) Verify(db *gorm.DB, realName, idCard string) error {
	return db.Model(p).Updates(map[string]interface{}{
		"name":        realName,
		"id_card":     idCard,
		"is_verified": true,
		"updated_at":  time.Now(),
	}).Error
}

// Delete 删除患者
func (p *Patient) Delete(db *gorm.DB, userID int64) error {
	if err := db.Delete(p).Error; err != nil {
		return err
	}

	// 如果删除的是默认就诊人，将下一个设为默认
	if p.IsDefault {
		var nextPatient Patient
		err := db.Where("user_id = ?", userID).First(&nextPatient).Error
		if err == nil {
			db.Model(&nextPatient).Update("is_default", true)
		}
	}

	return nil
}

// IsExists 检查患者是否存在
func IsPatientExists(db *gorm.DB, id, userID int64) bool {
	var count int64
	db.Model(&Patient{}).Where("id = ? AND user_id = ?", id, userID).Count(&count)
	return count > 0
}
